package com.example.kotlindemo.pages

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.kotlindemo.R
import com.example.kotlindemo.modules.network.LoginFragment
import com.example.kotlindemo.modules.network.UserInfoFragment

// 封装网络请求，使用 Repository + Flow + viewModelScope 实现Mvvm架构
// 1. Repository 使用
// 1.1 封装 ApiClient
//  初始化：在Application 类或首次使用前调用初始化
//  配置日志拦截器
//  配置认证拦截器
//  配置 OkHttp 客户端
//  配置 Retrofit
//  提供 ApiService 实例
//  使用 lazy 确保线程安全且只创建一次
// 1.2 suspend 关键字
//  标记这是一个挂起函数，可以在协程中调用
//  返回 Response<BaseResponse<T>>
//  检查 HTTP 状态码和外层业务逻辑是否成功
// 2. Flow 使用
//  在具体网络接口封装时，采用flow方法来发起网络请求
//  Flow 是 Kotlin Coroutines 提供的一种处理异步数据流（stream of values）的类型
//  flow可以按照调用顺序发射（emit）零个或多个值
//  flow是冷流Cold Stream，只有当有收集器（collector）开始收集（collect）时，Flow 内部的代码块（flow { ... }）才会执行。每次收集都会重新执行。
// 2.1 flow { ... }
//  创建 Flow ，emit(value)`: 在 Flow 中发射一个值。可以多次调用 `emit` 来发射多个值
// 3.1 collect { ... }
//  用于启动 Flow 并接收其发射的值。`collect` 是一个挂起函数，它会一直运行直到 Flow 完成
//  在 ViewModel 中会调用 `collect` 来接收 Repository 发射的 `Resource` 状态
// 3.2 flowOn(Dispatcher)
//  用于改变 Flow 上游操作执行的协程上下文（通常是切换线程池）
//  flowOn(Dispatchers.IO)`确保网络请求、数据库读写等阻塞性 IO 操作在后台线程执行，避免阻塞主线程。
// 3. viewModelScope 的使用
//  绑定到 ViewModel 生命周期的 CoroutineScope
//  当 ViewModel 被销毁时（通常是关联的 Activity/Fragment 结束后），`viewModelScope` 会自动取消其内部启动的所有协程。这有助于防止内存泄漏和不必要的工作
// 3.1 launch { ... }
//  启动一个新的协程，而不会阻塞当前线程
//  `viewModelScope.launch` 默认在主线程（Dispatchers.Main.immediate）启动协程，这对于更新 LiveData（进而更新 UI）是安全的
// 3.2 suspend fun
//  `loginRepository.login(params).collect { ... }` 这样的操作包含挂起函数调用（`collect` 是挂起的）。
//  挂起函数只能在协程或其他挂起函数中调用。`viewModelScope.launch` 提供了一个协程环境
// 3.3 收集 Flow (`collect`)
//  在 `viewModelScope.launch` 启动的协程中，我们调用 Flow 的 `collect` 方法来接收 Repository 发射的 `Resource` 状态。

// 为什么用 Flow 而不是直接返回 suspend fun 的结果？
//  Flow 可以轻松地发射多个状态。在这个例子中，我们先发射 `Loading`，然后是 `Success` 或 `Error`。这对于向 UI 展示加载状态非常有用。
//  Flow 提供了丰富的操作符（map, filter, retry, combine 等），可以方便地对数据流进行转换和处理。
//  Flow 与协程无缝集成，遵循结构化并发。

class NewWorkActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_net_work)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        // 动态添加 Fragment
        if (savedInstanceState == null) {
            val transaction = supportFragmentManager.beginTransaction()
            transaction.replace(R.id.login_fragment, LoginFragment())
            transaction.replace(R.id.user_info_fragment, UserInfoFragment())
            transaction.commit()
        }
    }
}